package com.zzedu.common.utils;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class NextWeekdayUtils {


    /**
     * 连续查找若干组目标星期几，每组包含多个目标日期（如周日+周一），并将其合并为一个排序后的单一列表。
     *
     * @param startDateTime    起始时间
     * @param targetDaysOfWeek 目标星期几列表（顺序重要，如 [SUNDAY, MONDAY]）
     * @param groupCount       要查找的组数
     * @return 排序后的一个 List<LocalDateTime> 包含所有目标日期
     */
    public static List<LocalDateTime> findWeeklyGroupsAsSingleList(
            LocalDateTime startDateTime,
            List<DayOfWeek> targetDaysOfWeek,
            int groupCount) {
        // 获取分组结果
        List<List<LocalDateTime>> groups = findWeeklyGroups(startDateTime, targetDaysOfWeek, groupCount);

        // 合并分组结果为单一列表
        List<LocalDateTime> resultList = new ArrayList<>();
        for (List<LocalDateTime> group : groups) {
            resultList.addAll(group);
        }

        // 由于我们是按顺序生成的日期，这里实际上已经有序了，但如果你需要确保顺序，可以加上这一行：
        resultList.sort(Comparator.naturalOrder());

        return resultList;
    }

    /**
     * 连续查找若干组目标星期几，每组包含多个目标日期（如周日+周一）
     */
    public static List<List<LocalDateTime>> findWeeklyGroups(
            LocalDateTime startDateTime,
            List<DayOfWeek> targetDaysOfWeek,
            int groupCount) {
        if (targetDaysOfWeek == null || targetDaysOfWeek.isEmpty()) {
            throw new IllegalArgumentException("目标星期几不能为空");
        }

        List<List<LocalDateTime>> result = new ArrayList<>();

        // 将目标星期几转换为偏移天数（Monday=0 ~ Sunday=6）
        List<Integer> targetOffsets = new ArrayList<>();
        for (DayOfWeek day : targetDaysOfWeek) {
            int offset = (day.getValue() - 1) % 7; // Monday = 0 ~ Sunday = 6
            targetOffsets.add(offset);
        }

        // 确保目标星期几是递增顺序（否则跨周处理会出错）
        Collections.sort(targetOffsets);

        // 当前周的起始时间（设置为当天 00:00）
        LocalDateTime currentWeekStart = startDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);

        // 找到当前周起始时间对应的星期几偏移
        int baseDayOfWeek = (currentWeekStart.getDayOfWeek().getValue() - 1) % 7;

        for (int i = 0; i < groupCount; i++) {
            List<LocalDateTime> group = new ArrayList<>();

            for (Integer offset : targetOffsets) {
                // 计算该目标星期几在本周中的具体日期
                LocalDateTime date = currentWeekStart.plusDays((offset - baseDayOfWeek + 7) % 7);
                group.add(date);
            }

            result.add(group);

            // 下一周的起始时间
            currentWeekStart = currentWeekStart.plusWeeks(1);
        }

        return result;
    }

/*    public static void main(String[] args) {
        LocalDateTime openDateTime = LocalDateTime.of(2025, 6, 14, 10, 0); // 周日
        List<DayOfWeek> targetDaysOfWeek = Arrays.asList(DayOfWeek.SUNDAY, DayOfWeek.FRIDAY);
        int repeatCount = 2;
        List<LocalDateTime> results = NextWeekdayUtils.findWeeklyGroupsAsSingleList(openDateTime, targetDaysOfWeek, repeatCount);

        for (LocalDateTime dt : results) {
            System.out.println(dt);
        }
    }*/
}